package je3.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * This program waits to receive datagrams sent to the specified port.
 * When it receives one, it displays the sending host and prints the
 * contents of the datagram as a string.  Then it loops and waits again.
 */
public class UDPReceive {
    public static final String usage = "Usage: java UDPReceive <port>";

    public static void main(String args[]) {
        try {
            if (args.length != 1)
                throw new IllegalArgumentException("Wrong number of args");

            // Get the port from the command line
            int port = Integer.parseInt(args[0]);

            // Create a socket to listen on the port.
            DatagramSocket dsocket = new DatagramSocket(port);

            // Create a buffer to read datagrams into.  If anyone sends us a
            // packet containing more than will fit into this buffer, the
            // excess will simply be discarded!
            byte[] buffer = new byte[2048];

            // Create a packet to receive data into the buffer
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            // Now loop forever, waiting to receive packets and printing them.
            for (; ;) {
                // Wait to receive a datagram
                dsocket.receive(packet);

                // Decode the bytes of the packet to characters, using the
                // UTF-8 encoding, and then display those characters.
                String msg = new String(buffer, 0, packet.getLength(), "UTF-8");
                System.out.println(packet.getAddress().getHostName() +
                        ": " + msg);

                // Reset the length of the packet before reusing it.
                // Prior to Java 1.1, we'd just create a new packet each time.
                packet.setLength(buffer.length);
            }
        }
        catch (Exception e) {
            System.err.println(e);
            System.err.println(usage);
        }
    }
}
